pub fn parse(toml: &str, file: &str) -> CargoResult<toml::Table> {
let mut parser = toml::Parser::new(toml.as_slice());
match parser.parse() {
- Some(toml) => Ok(toml),
- None => {
- let mut error_str = format!("could not parse input TOML\n");
- for error in parser.errors.iter() {
- let (loline, locol) = parser.to_linecol(error.lo);
- let (hiline, hicol) = parser.to_linecol(error.hi);
- error_str.push_str(format!("{}:{}:{}{} {}\n",
- file,
- loline + 1, locol + 1,
- if loline != hiline || locol != hicol {
- format!("-{}:{}", hiline + 1,
- hicol + 1)
- } else {
- "".to_string()
- },
- error.desc).as_slice());
- }
- Err(human(error_str))
- }
+ Some(toml) => return Ok(toml),
+ None => {}
}
+ let mut error_str = format!("could not parse input TOML\n");
+ for error in parser.errors.iter() {
+ let (loline, locol) = parser.to_linecol(error.lo);
+ let (hiline, hicol) = parser.to_linecol(error.hi);
+ error_str.push_str(format!("{}:{}:{}{} {}\n",
+ file,
+ loline + 1, locol + 1,
+ if loline != hiline || locol != hicol {
+ format!("-{}:{}", hiline + 1,
+ hicol + 1)
+ } else {
+ "".to_string()
+ },
+ error.desc).as_slice());
+ }
+ Err(human(error_str))
}
type TomlLibTarget = TomlTarget;
};
// Collect the deps
- try!(process_dependencies(&mut cx, self.dependencies.as_ref()));
- try!(process_dependencies(&mut cx, self.dev_dependencies.as_ref()));
+ try!(process_dependencies(&mut cx, false, self.dependencies.as_ref()));
+ try!(process_dependencies(&mut cx, true, self.dev_dependencies.as_ref()));
}
let project = self.project.as_ref().or_else(|| self.package.as_ref());
}
}
-fn process_dependencies<'a>(cx: &mut Context<'a>,
+fn process_dependencies<'a>(cx: &mut Context<'a>, dev: bool,
new_deps: Option<&HashMap<String, TomlDependency>>)
-> CargoResult<()> {
- match new_deps {
- Some(ref dependencies) => {
- for (n, v) in dependencies.iter() {
- let (version, source_id) = match *v {
- SimpleDep(ref string) => {
- (Some(string.clone()), SourceId::for_central())
- },
- DetailedDep(ref details) => {
- let reference = details.branch.clone()
- .or_else(|| details.tag.clone())
- .or_else(|| details.rev.clone())
- .unwrap_or_else(|| "master".to_str());
-
- let new_source_id = match details.git {
- Some(ref git) => {
- let kind = GitKind(reference.clone());
- let loc = try!(Location::parse(git.as_slice()));
- let source_id = SourceId::new(kind, loc);
- // TODO: Don't do this for path
- cx.source_ids.push(source_id.clone());
- Some(source_id)
- }
- None => {
- details.path.as_ref().map(|path| {
- cx.nested_paths.push(Path::new(path.as_slice()));
- cx.source_id.clone()
- })
- }
- }.unwrap_or(SourceId::for_central());
-
- (details.version.clone(), new_source_id)
+ let dependencies = match new_deps {
+ Some(ref dependencies) => dependencies,
+ None => return Ok(())
+ };
+ for (n, v) in dependencies.iter() {
+ let (version, source_id) = match *v {
+ SimpleDep(ref string) => {
+ (Some(string.clone()), SourceId::for_central())
+ },
+ DetailedDep(ref details) => {
+ let reference = details.branch.clone()
+ .or_else(|| details.tag.clone())
+ .or_else(|| details.rev.clone())
+ .unwrap_or_else(|| "master".to_str());
+
+ let new_source_id = match details.git {
+ Some(ref git) => {
+ let kind = GitKind(reference.clone());
+ let loc = try!(Location::parse(git.as_slice()));
+ let source_id = SourceId::new(kind, loc);
+ // TODO: Don't do this for path
+ cx.source_ids.push(source_id.clone());
+ Some(source_id)
+ }
+ None => {
+ details.path.as_ref().map(|path| {
+ cx.nested_paths.push(Path::new(path.as_slice()));
+ cx.source_id.clone()
+ })
}
- };
+ }.unwrap_or(SourceId::for_central());
- cx.deps.push(try!(Dependency::parse(n.as_slice(),
- version.as_ref().map(|v| v.as_slice()),
- &source_id)))
+ (details.version.clone(), new_source_id)
}
- }
- None => ()
+ };
+
+ let mut dep = try!(Dependency::parse(n.as_slice(),
+ version.as_ref().map(|v| v.as_slice()),
+ &source_id));
+
+ if dev { dep = dep.as_dev() }
+
+ cx.deps.push(dep)
}
Ok(())
execs().with_stdout("test passed\n"));
})
-test!(cargo_compile_with_dev_deps {
+test!(cargo_compile_with_root_dev_deps {
+ let p = project("foo")
+ .file("Cargo.toml", r#"
+ [project]
+
+ name = "foo"
+ version = "0.5.0"
+ authors = ["wycats@example.com"]
+
+ [dev-dependencies.bar]
+
+ version = "0.5.0"
+ path = "bar"
+
+ [[bin]]
+
+ name = "foo"
+ "#)
+ .file("src/foo.rs",
+ main_file(r#""{}", bar::gimme()"#, ["bar"]).as_slice())
+ .file("bar/Cargo.toml", r#"
+ [project]
+
+ name = "bar"
+ version = "0.5.0"
+ authors = ["wycats@example.com"]
+
+ [[lib]]
+
+ name = "bar"
+ "#)
+ .file("bar/src/bar.rs", r#"
+ pub fn gimme() -> &'static str {
+ "zoidberg"
+ }
+ "#)
+ ;
+
+ assert_that(p.cargo_process("cargo-build"),
+ execs().with_stdout(format!("{} bar v0.5.0 (file:{})\n\
+ {} foo v0.5.0 (file:{})\n",
+ COMPILING, p.root().display(),
+ COMPILING, p.root().display())));
+
+ assert_that(&p.bin("foo"), existing_file());
+
+ assert_that(
+ cargo::util::process(p.bin("foo")),
+ execs().with_stdout("zoidberg\n"));
+})
+
+test!(cargo_compile_with_transitive_dev_deps {
let p = project("foo")
.file("Cargo.toml", r#"
[project]